/**
 * ResizeObserver 错误修复工具
 * 用于处理 "ResizeObserver loop completed with undelivered notifications" 错误
 */

let originalErrorHandler = null
let isErrorHandlerInstalled = false
import logger from '../utils/logger.js'

/**
 * 安装 ResizeObserver 错误处理
 */
export function installResizeObserverErrorHandler() {
  if (isErrorHandlerInstalled) {
    return
  }

  originalErrorHandler = window.onerror
  
  window.onerror = (message, source, lineno, colno, error) => {
    // 捕获并忽略 ResizeObserver 错误
    if (message && message.includes('ResizeObserver loop completed with undelivered notifications')) {
      logger.warn('⚠️ ResizeObserver 错误已被捕获并忽略:', message)
      return true // 阻止错误冒泡
    }
    
    // 其他错误继续使用原来的处理方式
    if (originalErrorHandler) {
      return originalErrorHandler(message, source, lineno, colno, error)
    }
    return false
  }
  
  isErrorHandlerInstalled = true
  logger.log('✅ ResizeObserver 错误处理器已安装')
}

/**
 * 卸载 ResizeObserver 错误处理
 */
export function uninstallResizeObserverErrorHandler() {
  if (!isErrorHandlerInstalled) {
    return
  }
  
  window.onerror = originalErrorHandler
  originalErrorHandler = null
  isErrorHandlerInstalled = false
  logger.log('✅ ResizeObserver 错误处理器已卸载')
}

/**
 * 安全的 ResizeObserver 创建函数
 * 自动处理错误并重试
 */
export function createSafeResizeObserver(callback, options = {}) {
  if (!window.ResizeObserver) {
    logger.warn('⚠️ ResizeObserver 不支持，使用 window resize 事件替代')
    return null
  }
  
  try {
    return new ResizeObserver((entries) => {
      try {
        callback(entries)
      } catch (error) {
        logger.warn('⚠️ ResizeObserver 回调函数执行出错:', error)
      }
    })
  } catch (error) {
    logger.warn('⚠️ 创建 ResizeObserver 失败:', error)
    return null
  }
}

/**
 * 防抖的布局调整函数
 * 用于在尺寸变化时调整编辑器布局
 */
export function createDebouncedLayoutAdjuster(editor, delay = 100) {
  let timeoutId = null
  
  return () => {
    if (timeoutId) {
      clearTimeout(timeoutId)
    }
    
    timeoutId = setTimeout(() => {
      if (editor && typeof editor.layout === 'function') {
        try {
          editor.layout()
        } catch (error) {
          logger.warn('⚠️ 编辑器布局调整失败:', error)
        }
      }
    }, delay)
  }
}

/**
 * 初始化全局错误处理
 * 在应用启动时调用
 */
export function initGlobalErrorHandling() {
  // 安装 ResizeObserver 错误处理
  installResizeObserverErrorHandler()
  
  // 处理未捕获的 Promise 错误
  window.addEventListener('unhandledrejection', (event) => {
    if (event.reason && event.reason.message && 
        event.reason.message.includes('ResizeObserver loop completed with undelivered notifications')) {
      logger.warn('⚠️ 未捕获的 ResizeObserver 错误已被处理:', event.reason.message)
      event.preventDefault()
    }
  })
  
  logger.log('✅ 全局错误处理已初始化')
}

/**
 * 清理全局错误处理
 * 在应用卸载时调用
 */
export function cleanupGlobalErrorHandling() {
  uninstallResizeObserverErrorHandler()
  logger.log('✅ 全局错误处理已清理')
}
